﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Entidades;
using LogicaNegocio;

namespace PresentacionEscritorio
{
    public partial class frmAgendaDelDia : Form
    {
        public int estadoTurnoSeleccionado { get; set; }
        private List<EstadoTurno> listaEstadosTurno;
        private List<Consultorio> listaConsultorios;
        private GestorMedicos gM = new GestorMedicos();
        private frmCobroAtencionMédica formCobroAtencion;
        private Turno turnoSeleccionado = new Turno();
        private long idTurnoSeleccionado;
        private int nroFilaTurnoSeleccionado;
        private int nroColumnaSeleccionado;
        private long nroHCturno;
        public Medico oM { get; set; }

        private long[,] matrizIdTurnos;

        public frmAgendaDelDia()
        {
            InitializeComponent();
        }

        private void frmAgendaDelDia_Load(object sender, EventArgs e)
        {
            txtNombre.ReadOnly = true;
            txtApellido.ReadOnly = true;
            txtMatricula.ReadOnly = true;
            txtEspecialidad.ReadOnly = true;

            listaEstadosTurno = GestorAgendaTurnos.obtenerEstadosTurno();
            listaConsultorios = GestorAgendaTurnos.obtenerConsultorios();
            cargarMedico();
            cargarGrillaHoy();
        }
        private void cargarMedico()
        {
            this.oM = oM;
            txtNombre.Text = oM.Nombre;
            List<EspecialidadMedico> lstEM = gM.ObtenerEspecialidadesVigentesMedico(oM.Legajo);
            if (lstEM != null)
            {
                foreach (EspecialidadMedico item in lstEM)
                {
                    txtEspecialidad.Text += "/" + item.Especialidad.Nombre;
                }
            }
            txtApellido.Text = oM.Apellido;
            txtMatricula.Text = oM.NroMatricula.ToString();
        }
        private void cargarGrillaHoy()
        {
            //limpiamos grilla
            if (grdAgenda.RowCount > 0)
                grdAgenda.Rows.Clear();
            if (grdAgenda.ColumnCount > 0)
                grdAgenda.Columns.Clear();

            //1° creamos las columnas
            grdAgenda.Columns.Add("Hora/Consultorio", "Hora/Consultorio");
            for (int i = 0; i < listaConsultorios.Count; i++)
            {
                string nombreColumna = listaConsultorios[i].IdConsultorio.ToString();
                string headerColumna = listaConsultorios[i].Nombre;

                grdAgenda.Columns.Add(nombreColumna, headerColumna);
            }


            //2° seteamos la franja horaria
            TimeSpan horaInicioMañana = new TimeSpan(08, 0, 0);
            TimeSpan horaCierreMañana = new TimeSpan(13, 0, 0);
            TimeSpan horaInicioTarde = new TimeSpan(16, 0, 0);
            TimeSpan horaCierreTarde = new TimeSpan(21, 0, 0);

            TimeSpan horaInicio;
            TimeSpan duracionCelda = new TimeSpan(0, 30, 0);

            bool esMañana = false;

            if (DateTime.Now.TimeOfDay <= horaInicioMañana)//(DateTime.Now.TimeOfDay >= horaInicioMañana && DateTime.Now.TimeOfDay <= horaCierreMañana)
            {
                //muestro turno mañana, cargando filas vacias
                esMañana = true;
                horaInicio = horaInicioMañana;
                while (horaInicio <= horaCierreMañana)
                {
                    int nroFila = grdAgenda.Rows.Add();
                    grdAgenda.Rows[nroFila].Cells["Hora/Consultorio"].Value = horaInicio;
                    grdAgenda.Rows[nroFila].Cells["Hora/Consultorio"].Style.BackColor = Color.DimGray;

                    //empieza por la 2da columna
                    for (int i = 1; i < grdAgenda.ColumnCount; i++)
                    {
                        grdAgenda.Rows[nroFila].Cells[i].Style.BackColor = Color.LightGray; //no disponible por defecto
                    }

                    //sumamos
                    horaInicio = horaInicio.Add(duracionCelda);
                }

            }
            else
            {
                //if (DateTime.Now.TimeOfDay > horaCierreMañana && DateTime.Now.TimeOfDay <= horaCierreTarde)
                //{
                //muestro turno tarde
                horaInicio = horaInicioTarde;
                while (horaInicio <= horaCierreTarde)
                {
                    int nroFila = grdAgenda.Rows.Add();
                    grdAgenda.Rows[nroFila].Cells["Hora/Consultorio"].Value = horaInicio;
                    grdAgenda.Rows[nroFila].Cells["Hora/Consultorio"].Style.BackColor = Color.DimGray;

                    //empieza por la 2da columna
                    for (int i = 1; i < grdAgenda.ColumnCount; i++)
                    {
                        grdAgenda.Rows[nroFila].Cells[i].Style.BackColor = Color.LightGray; //no disponible por defecto
                    }

                    //sumamos
                    horaInicio = horaInicio.Add(duracionCelda);
                }
            }
            //} //fin if

            //ahora que esta la grilla completa, puedo saber el tamaño de la matriz
            matrizIdTurnos = new long[grdAgenda.RowCount, grdAgenda.ColumnCount];




            //3° traemos los turnos del dia
            //DateTime fechaAbuscar = DateTime.Now();
           // DateTime fechaAbuscar = new DateTime(2014,11,04);
            DateTime fechaAbuscar = new DateTime(2014, 11, 18);
            //OBTENER DIA DE LA SEMANA
            int nroDia = 0;
            switch (fechaAbuscar.DayOfWeek)
            {
                case DayOfWeek.Friday:
                    nroDia = 6;
                    break;
                case DayOfWeek.Monday:
                    nroDia = 2;
                    break;
                case DayOfWeek.Saturday:
                    nroDia = 7;
                    break;
                case DayOfWeek.Sunday:
                    nroDia = 1;
                    break;
                case DayOfWeek.Thursday:
                    nroDia = 5;
                    break;
                case DayOfWeek.Tuesday:
                    nroDia = 3;
                    break;
                case DayOfWeek.Wednesday:
                    nroDia = 4;
                    break;
            }

            List<Turno> listaTurnosDia = GestorAgendaTurnos.obtenerTurnoPorFechaYMedico(fechaAbuscar, oM.Legajo);
            List<EspecialidadMedico> listaEspecialidadesDia = GestorAgendaTurnos.obtenerEspecialidadesXFechaYMedico(fechaAbuscar, nroDia,oM.Legajo);

            if (esMañana)
            {
                //busca los turnos a la mañana
                foreach (Turno item in listaTurnosDia)
                {
                    if (item.HoraTurno >= horaInicioMañana && item.HoraTurno <= horaCierreMañana)
                    {
                        //cargo a la grilla
                        foreach (EspecialidadMedico espMed in listaEspecialidadesDia)
                        {
                            if (espMed.CodEspecialidad == item.IdEspecialidad && espMed.LegajoMedico == item.LegajoMedico)
                            {
                                item.duracionturno = new TimeSpan(0, espMed.duracionAtencion, 0);
                                string numeroColumna = espMed.idConsultorioPorDiaBuscado.ToString();
                                for (int i = 0; i < grdAgenda.Rows.Count; i++)
                                {
                                    TimeSpan horaCelda = TimeSpan.Parse(grdAgenda.Rows[i].Cells[0].Value.ToString());
                                    if (item.HoraTurno == horaCelda)
                                    {
                                        matrizIdTurnos[i, espMed.idConsultorioPorDiaBuscado] = item.IdTurno; //guardamos el id de turno de la celda
                                        //validamos el estado del turno
                                        switch (item.IdEstadoTurno)
                                        {
                                            case 1: //disponible
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.White;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno;
                                                break;
                                            case 2: //asignado
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.Orange;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno; //agregar nombre paciente
                                                break;
                                            case 3: //asistido no cobrado
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.Chocolate;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno; //agregar nombre paciente
                                                break;
                                            case 4: //asistido cobrado
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.LightCoral;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno; //agregar nombre paciente
                                                break;
                                            case 5: //atendido no cobrado
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.YellowGreen;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno; //agregar nombre paciente
                                                break;
                                            case 6: //atendido cobrado
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.SeaGreen;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno; //agregar nombre paciente
                                                break;
                                            case 7: //no asistido
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.DarkGray;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno; //agregar nombre paciente
                                                break;

                                        } //fin switch
                                    }//fin if hora celda
                                }
                            }
                        }
                    }


                }
            }
            else
            {
                //busca los turnos a la tarde
                foreach (Turno item in listaTurnosDia)
                {
                    if (item.HoraTurno >= horaInicioTarde && item.HoraTurno <= horaCierreTarde)
                    {
                        //cargo a la grilla
                        foreach (EspecialidadMedico espMed in listaEspecialidadesDia)
                        {
                            if (espMed.CodEspecialidad == item.IdEspecialidad && espMed.LegajoMedico == item.LegajoMedico)
                            {
                                item.duracionturno = new TimeSpan(0, espMed.duracionAtencion, 0);
                                string numeroColumna = espMed.idConsultorioPorDiaBuscado.ToString();
                                for (int i = 0; i < grdAgenda.Rows.Count; i++)
                                {
                                    TimeSpan horaCelda = TimeSpan.Parse(grdAgenda.Rows[i].Cells[0].Value.ToString());
                                    if (item.HoraTurno == horaCelda)
                                    {
                                        matrizIdTurnos[i, espMed.idConsultorioPorDiaBuscado] = item.IdTurno; //guardamos el id de turno de la celda
                                        //validamos el estado del turno
                                        switch (item.IdEstadoTurno)
                                        {
                                            case 1: //disponible
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.White;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno;
                                                break;
                                            case 2: //asignado
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.Orange;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno; //agregar nombre paciente
                                                break;
                                            case 3: //asistido no cobrado
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.Chocolate;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno; //agregar nombre paciente
                                                break;
                                            case 4: //asistido cobrado
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.LightCoral;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno; //agregar nombre paciente
                                                break;
                                            case 5: //atendido no cobrado
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.YellowGreen;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno; //agregar nombre paciente
                                                break;
                                            case 6: //atendido cobrado
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.SeaGreen;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno; //agregar nombre paciente
                                                break;
                                            case 7: //no asistido
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.Red;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno; //agregar nombre paciente
                                                break;
                                            case 8: //Anulado
                                                grdAgenda.Rows[i].Cells[numeroColumna].Style.BackColor = Color.MidnightBlue;
                                                grdAgenda.Rows[i].Cells[numeroColumna].Value = item.HoraTurno; //agregar nombre paciente
                                                break;

                                        } //fin switch
                                    }
                                }
                            }
                        }

                    }
                }
            }


        }

 
        private void verPacienteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            long idBusqueda = nroHCturno;
            frmMostrarDatosPaciente frm = new frmMostrarDatosPaciente(idBusqueda);
            frm.Show();
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void grdAgenda_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            int fila = grdAgenda.CurrentCell.RowIndex;
            int column = grdAgenda.CurrentCell.ColumnIndex;

            if (grdAgenda.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor == Color.Orange)  //turno asignado
            {
                estadoTurnoSeleccionado = 2;

                //tomamos el id del turno
                idTurnoSeleccionado = matrizIdTurnos[fila, column];
                //OBTENEMOS EL TURNO que selecciono
                turnoSeleccionado = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado);

                //tomamos el nroHC del paciente que tiene el turno
                nroHCturno = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado).NroHCPaciente;

                //guardamos la celda a la que pertenece dicho turno
                nroFilaTurnoSeleccionado = e.RowIndex;
                nroColumnaSeleccionado = e.ColumnIndex;


                contextMenuStrip1.Items["verPacienteToolStripMenuItem"].Visible = true;
                Point p = PointToClient(MousePosition);
                contextMenuStrip1.Show(this, p);

            }
            if (grdAgenda.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor == Color.YellowGreen)
            {
                estadoTurnoSeleccionado = 5;

                //tomamos el id del turno
                idTurnoSeleccionado = matrizIdTurnos[fila, column];
                //OBTENEMOS EL TURNO que selecciono
                turnoSeleccionado = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado);

                //tomamos el nroHC del paciente que tiene el turno
                nroHCturno = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado).NroHCPaciente;

                //guardamos la celda a la que pertenece dicho turno
                nroFilaTurnoSeleccionado = e.RowIndex;
                nroColumnaSeleccionado = e.ColumnIndex;


                contextMenuStrip1.Items["verPacienteToolStripMenuItem"].Visible = true;
                Point p = PointToClient(MousePosition);
                contextMenuStrip1.Show(this, p);

            }
            else if (grdAgenda.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor == Color.Chocolate) //turno asistido sin cobrar
            {
                //MessageBox.Show("Turno registrado con llegada a " + nombrePaciente, "Aviso", MessageBoxButtons.OKCancel);
                estadoTurnoSeleccionado = 3;

                //tomamos el id del turno
                idTurnoSeleccionado = matrizIdTurnos[fila, column];
                //tomamos el nroHC del paciente que tiene el turno
                nroHCturno = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado).NroHCPaciente;

                //guardamos la celda a la que pertenece dicho turno
                nroFilaTurnoSeleccionado = e.RowIndex;
                nroColumnaSeleccionado = e.ColumnIndex;


                contextMenuStrip1.Items["verPacienteToolStripMenuItem"].Visible = true;
                Point p = PointToClient(MousePosition);
                contextMenuStrip1.Show(this, p);
            }
            else if (grdAgenda.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor == Color.LightCoral) //Asistido y cobrado
            {
                estadoTurnoSeleccionado = 6;

                //tomamos el id del turno
                idTurnoSeleccionado = matrizIdTurnos[fila, column];
                //tomamos el nroHC del paciente que tiene el turno
                nroHCturno = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado).NroHCPaciente;

                //guardamos la celda a la que pertenece dicho turno
                nroFilaTurnoSeleccionado = e.RowIndex;
                nroColumnaSeleccionado = e.ColumnIndex;

                contextMenuStrip1.Items["verPacienteToolStripMenuItem"].Visible = true;
                Point p = PointToClient(MousePosition);
                contextMenuStrip1.Show(this, p);
            }
            else if (grdAgenda.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor == Color.SeaGreen) //Atendido y cobrado
            {
                estadoTurnoSeleccionado = 6;

                //tomamos el id del turno
                idTurnoSeleccionado = matrizIdTurnos[fila, column];

                //tomamos el nroHC del paciente que tiene el turno
                nroHCturno = GestorAgendaTurnos.obtenerPacienteTurno(idTurnoSeleccionado).NroHCPaciente;

                //guardamos la celda a la que pertenece dicho turno
                nroFilaTurnoSeleccionado = e.RowIndex;
                nroColumnaSeleccionado = e.ColumnIndex;

                contextMenuStrip1.Items["verPacienteToolStripMenuItem"].Visible = true;
                Point p = PointToClient(MousePosition);
                contextMenuStrip1.Show(this, p);
            }
        }


    }
}
